

function getTenNumStr( num )
    return num>=10 and tostring(num) or "0"..num
end

function GetFromatInfo(fmt)
    local fmtPosMap = {}
    local fmtChars = {}
    local startIdx = 1
    local parttern = "{%l-}" --匹配小写字母0次或1次
    local i,j = string.find( fmt,parttern,startIdx)
    local fmtChar = string.match( fmt,parttern,startIdx )
    print("i,j,fmtChar=",i,j,fmtChar)
    while j and fmtChar do
        fmtChar = string.match( fmtChar,"%l+",1)
        print("while fmtChar=",fmtChar)
        table.insert( fmtChars, fmtChar )
        fmtPosMap[fmtChar] = {start=i,endIdx=j,idx=#fmtChars}
        startIdx = j
        i,j = string.find( fmt,parttern,startIdx)
        fmtChar = string.match( fmt,parttern,startIdx )
        print("aaaa i,j,fmt=",i,j,fmtChar)
    end
    return fmtPosMap,fmtChars
end

--- 格式化时间显示
---@param sec integer 剩余秒数
---@param fmt string 时间显示格式，日时分秒 -> dhms (hh 表示小于10的显示成01,只识别小写,必须用花括号包起来 {h} ) 例如:剩余{dd}天{hh}时{m}分{s}秒
---@param useShort boolean 是否为0的不显示 例如 剩余{dd}天{hh}时{m}分{s}秒 当天数为0时 显示成 剩余{hh}时{m}分{s}秒
---@param fmtPosMap table dhms在字符串中的位置信息 （不传会自动生成）
---@param fmtChars table dhms所有格式字符 （不传会自动生成）
function Format(sec,fmt,useShort,fmtPosMap,fmtChars)
    -- body
    useShort = useShort==true
    local fmtSecInfo = {}
    fmtSecInfo["d"] = 86400 -- 1天的秒数
    fmtSecInfo["h"] = 3600 --1小时的秒数
    fmtSecInfo["m"] = 60 --一分钟的秒数
    fmtSecInfo["s"] = 0

    if fmtPosMap==nil or fmtChars==nil then
        fmtPosMap,fmtChars = GetFromatInfo(fmt)
    end

    local firstFmt = fmtChars[1]
    local pos = fmtPosMap[firstFmt]
    local retFmt = string.sub( fmt,1,pos.start-1)
    if retFmt==nil then
        retFmt = ""
    end
    local len = #fmtChars
    local fmtLen = #fmt
    for i, v in ipairs(fmtChars) do
        local fmtSec = fmtSecInfo[string.sub( v, 1,1 )] --该格式是多少秒 小时->h 就是3600秒
        local val = 0;
        if fmtSec>0 then
            val = math.floor( sec/fmtSec ) --该格式的值
            sec = sec % fmtSec;--剩余秒数
        else
            val = sec
        end
        --print("Format xx i=",i,"v=",v,"val=",val,"sec=",sec,"fmtSec=",fmtSec)
        if val>0 or not useShort then --该格式需要一直显示
            local curPos = fmtPosMap[v].start
            local nextIdx = i+1
            local nextPos;
            if i<len then
                nextPos = fmtPosMap[fmtChars[nextIdx]].start - 1
            else
                nextPos = fmtLen
            end
            local valStr = tostring(val)
            if #v==2 then --需要显示 00 模式
                valStr = getTenNumStr(val)
            end
            local tempStr = string.sub( fmt, curPos,nextPos)
            print("Format yy v=",v,"tempStr=",tempStr,"retFmt=",retFmt)
            retFmt = retFmt..string.gsub( tempStr,"{"..v.."}",valStr)
            print("Format zz v=",v,"tempStr=",tempStr,"retFmt=",retFmt)
        end
    end
    return retFmt
end

--1天1小时3分25秒
--
local fmt = "剩余{dd}天{hh}时{mm}分{s}秒"
local sec = 0 + 3600*3 + 60*3 + 26

local fmtPosMap,fmtChars = GetFromatInfo(fmt)

print("=",string.byte( fmt,1),"sub=",string.sub( fmt, 16,18 ))

for k, v in pairs(fmtPosMap) do
    print("=====fmtPosMap=",k)
end

for i, v in ipairs(fmtChars) do
    print("xxxxxfmtChars=",i,v)
end

-- local dd = "d"
-- print("dd=",string.sub( fmt, 10,#fmt ),"#fmt=",#fmt)

local posMap,fmtChars = GetFromatInfo(fmt)

-- for i = 1, 100, 1 do
--     local st = os.clock()
--     local timeStr = Format(sec,fmt)
--     print("timeStr=",timeStr,"耗时 毫秒=",(os.clock() - st)*1000)
--     sec = sec - 1
-- end

-- flag = nil
-- numVal =2
-- b = flag and numVal==1 or numVal==2
-- print("b=",b)
-- if flag and numVal==1 or numVal==2 then
--     print("-++++++++++")
-- end



local timeStr = Format(sec,fmt,false)

print("timeStr=",timeStr)